<?php

namespace Aliyun;

use Yii;
use yii\base\InvalidParamException;
use Aliyun\Core\Config;
use Aliyun\Core\Profile\DefaultProfile;
use Aliyun\Core\DefaultAcsClient;
use Aliyun\Api\Sms\Request\V20170525\SendSmsRequest;
use Aliyun\Api\Sms\Request\V20170525\QuerySendDetailsRequest;

// 加载区域结点配置
Config::load();

/**
 * Class SmsDemo
 *
 * Created on 17/10/17.
 * 短信服务API产品的DEMO程序,工程中包含了一个SmsDemo类，直接通过
 * 执行此文件即可体验语音服务产品API功能(只需要将AK替换成开通了云通信-短信服务产品功能的AK即可)
 * 备注:Demo工程编码采用UTF-8
 */
class AlidayuSms extends \yii\base\Component {

    /**
     * @var string AccessKeyId
     * 此处需要替换成开发者自己的AK (https://ak-console.aliyun.com/)
     */
    public $accessKeyId;

    /**
     * @var string AccessKeySecret
     * 此处需要替换成开发者自己的AK (https://ak-console.aliyun.com/)
     */
    public $accessKeySecret;

    /**
     * @var string 产品名称:云通信流量服务API产品,开发者无需替换
     */
    public $product = 'Dysmsapi';

    /**
     * @var string 产品域名,开发者无需替换
     */
    public $domain = 'dysmsapi.aliyuncs.com';

    /**
     * @var string 暂时不支持多Region
     */
    public $region = 'cn-hangzhou';

    /**
     * @var string 服务结点
     */
    public $endPointName = 'cn-hangzhou';

    /**
     * @var string 短信签名内容
     */
    public $signName = '鲁能体育';

    /**
     * @var $acsClient
     */
    private $acsClient = null;

    public function __construct($config = array()) {
        parent::__construct($config);
        if (!$this->accessKeyId || !$this->accessKeySecret) {
            throw new InvalidParamException('Please set the values of the `accessKeyId` and `accessKeySecret` parameters before use!');
        }
        if ($this->acsClient === null) {
            //初始化acsClient,暂不支持region化
            $profile = DefaultProfile::getProfile($this->region, $this->accessKeyId, $this->accessKeySecret);
            // 增加服务结点
            DefaultProfile::addEndpoint($this->endPointName, $this->region, $this->product, $this->domain);
            // 初始化AcsClient用于发起请求
            $this->acsClient = new DefaultAcsClient($profile);
        }
    }

    /**
     * 获取AcsClient
     * @return DefaultAcsClient
     */
    public function getAcsClient() {
        return $this->acsClient;
    }

    /**
     * 发送短信
     * @param string|array $mobile 设置短信接收号码（必填）
     * @param string $template 设置模板CODE，应严格按"模板CODE"填写 请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/template
     * @param array $params 设置模板参数, 假如模板中存在变量需要替换则为必填项
     * @param array $options 其他配置信息
     * @return stdClass
     */
    public function sendSms($mobile, $template, $params = [], $options = []) {
        if (YII_ENV_DEV || YII_DEBUG) {
            return true;
        }

        $phoneNumbers = $this->filterPhoneNumber($mobile);

        // 初始化SendSmsRequest实例用于设置发送短信的参数
        $request = new SendSmsRequest();

        // 必填，设置短信接收号码
        $request->setPhoneNumbers($phoneNumbers);

        // 必填，设置签名名称，应严格按"签名名称"填写，请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/sign
        $request->setSignName($this->signName);

        // 必填，设置模板CODE，应严格按"模板CODE"填写, 请参考: https://dysms.console.aliyun.com/dysms.htm#/develop/template
        $request->setTemplateCode($template);

        // 可选，设置模板参数, 假如模板中存在变量需要替换则为必填项
        if (!empty($params)) {
            $request->setTemplateParam(json_encode($params, JSON_UNESCAPED_UNICODE));
        }

        // 可选，设置流水号
        if (isset($options['out_id'])) {
            $request->setOutId($options['out_id']);
        }
        // 选填，上行短信扩展码（扩展码字段控制在7位或以下，无特殊需求用户请忽略此字段）
        if (isset($options['sms_up_extend_code'])) {
            $request->setSmsUpExtendCode($options['sms_up_extend_code']);
        }

        // 发起访问请求
        $acsResponse = $this->getAcsClient()->getAcsResponse($request);
        if ($acsResponse->Code === 'OK') {
            return true;
        }
        Yii::error([
            $acsResponse,
            $mobile,
            $template,
            $params,
            $options
        ], __METHOD__);

        if ($acsResponse->Message) {
            return Yii::t('error/alisms', $acsResponse->Message);
        }
        return '短信发送失败';
    }

    /**
     * 短信发送记录查询
     * @return stdClass
     */
    public function querySendDetails($mobile, $sendDate, $currentPage = 1, $pageSize = 10, $bizId = null) {

        $phoneNumbers = $this->filterPhoneNumber($mobile);

        // 初始化QuerySendDetailsRequest实例用于设置短信查询的参数
        $request = new QuerySendDetailsRequest();

        // 必填，短信接收号码
        $request->setPhoneNumber($phoneNumbers);

        // 必填，短信发送日期，格式Ymd，支持近30天记录查询
        $request->setSendDate($sendDate);

        // 必填，分页大小
        $request->setPageSize($pageSize);

        // 必填，当前页码
        $request->setCurrentPage($currentPage);

        if ($bizId !== null) {
            // 选填，短信发送流水号
            $request->setBizId($bizId);
        }

        // 发起访问请求
        $acsResponse = $this->getAcsClient()->getAcsResponse($request);

        return $acsResponse;
    }

    protected function filterPhoneNumber($mobile) {
        if (is_string($mobile)) {
            $mobile = explode(',', $mobile);
        }
        $validator = new \common\validators\MobileValidator();
        $mobiles = array_filter($mobile, function($v) use ($validator) {
            $v = trim($v);
            if ($validator->validate($v, $error)) {
                return true;
            }
            return false;
        });
        return implode(',', $mobiles);
    }

}
